package priv.conceit.study.book.thread.chapter3.parts2;

import java.util.stream.IntStream;

/**
 * 3.2
 * yield方法
 * <p>
 * yield 属于启发式方法，会提示调度器会自愿放弃cpu资源
 * 如果cpu资源不太紧张 会忽略该方法
 * <p>
 * 调用yield方法 会使该线程 从running 进入runnable状态
 * 这个方法不太常用
 * <p>
 * yield和sleep
 * 实际在jdk1.5之前 yield方法实际上调用的是sleep(0)
 * 但是他俩之间有这不少差别
 * -sleep会导致线程 暂停指定的时间 没有cpu时间片的切换
 * -yield只是对cpu调度器的一个提示 假如cpu调度器没有忽略它 会导致线程上下文的切换
 * -sleep会导致线程进入blocked状态 会在指定的时间内释放cpu资源
 * -yield会时线程从running进入runnable状态（如果cpu调度器没有忽略提示）
 * -sleep几乎百分之百的完成给定时间的休眠，而yield不一定
 * -一个线程如果已经进入sleep状态 另一个线程使用interrupt方法会打断休眠，而yield不会
 *
 * @author Conceit
 * @since 1.0.0, 2019/6/14
 */
public class Yield {

	/**
	 * IntStream.range(1,100) 会输出0到100 之间的全部数字，不包含100
	 * <p>
	 * 如果不执行yield方法 多线程会进行资源的抢占 0和1 会随机打印
	 * 反之 如果开启yield方法 0会主动放弃资源 1则会优先输出
	 *
	 * @param args
	 */
	public static void main(String[] args) {

		//IntStream.range(100,101).forEach(System.out::print);
		IntStream.range(0, 2).mapToObj(Yield::create).forEach(Thread::start);
	}

	private static Thread create(int index) {

		return new Thread(() -> {
			if (index == 0) {
				Thread.yield();
			}
			System.out.println(index);
		});
	}


}
